﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LGPeWJNM.Trunfo
{
    public class Trunfo : BaseClasses.IClusterizacao
    {
        #region Membros de IClusterizacao

        public IEnumerable<IEnumerable<BaseClasses.ICliente>> Processar(IEnumerable<BaseClasses.Point> medianas, IEnumerable<BaseClasses.ICliente> destinos, BaseClasses.Point deposito, float capacidadeVeiculo)
        {
            var poolCliente = new List<BaseClasses.ICliente>(destinos);
            var ret = (from m in medianas
                       select new List<BaseClasses.ICliente>(new BaseClasses.Cliente[] { new BaseClasses.Cliente() { Nome = "mediana", Id = -1, Coordenada = m } })).ToList();
            while (poolCliente.Count > 0)
            {
                var topCliente = from c in poolCliente
                                 from gMed in ret
                                 select new { mediaDists = gMed.Average(mCli => mCli.Coordenada % c.Coordenada), gMed, c } into g
                                 where g.gMed.Sum(cc => cc.Demanda) + g.c.Demanda < capacidadeVeiculo
                                 //orderby g.c.Demanda descending, g.mediaDists
                                 orderby g.mediaDists, g.c.Demanda descending
                                 select g;
                var topClienteFirst = topCliente.AsParallel().First();

                topClienteFirst.gMed.Add(topClienteFirst.c);
                poolCliente.Remove(topClienteFirst.c);
            }
            foreach (var g in ret)
                g.RemoveAll(s => s.Demanda == 0);
            return ret;
        }

        #endregion Membros de IClusterizacao
    }
}